"""
AI API 调用服务
"""

import requests
import json
import logging
from flask import current_app

logger = logging.getLogger(__name__)


class AIService:
    """AI API 服务类"""
    
    def __init__(self):
        self.base_url = current_app.config.get('AI_API_BASE_URL')
        self.api_key = current_app.config.get('AI_API_KEY')
        self.timeout = current_app.config.get('AI_API_TIMEOUT', 30)
    
    def _get_headers(self):
        """获取请求头"""
        headers = {'Content-Type': 'application/json'}
        if self.api_key:
            headers['Authorization'] = f'Bearer {self.api_key}'
        return headers
    
    def chat(self, message, model=None, temperature=None, max_tokens=None, system_prompt=None):
        """
        普通对话（非流式）
        
        Args:
            message: 用户消息
            model: AI 模型
            temperature: 温度参数
            max_tokens: 最大Token数
            system_prompt: 系统提示词
        
        Returns:
            dict: 包含成功状态和回复内容的字典
        """
        try:
            # 构建消息列表
            messages = []
            
            # 添加系统提示词
            if system_prompt:
                messages.append({'role': 'system', 'content': system_prompt})
            
            # 添加用户消息
            messages.append({'role': 'user', 'content': message})
            
            # 构建请求
            request_data = {
                'model': model or current_app.config.get('DEFAULT_MODEL'),
                'messages': messages,
                'temperature': temperature if temperature is not None else current_app.config.get('DEFAULT_TEMPERATURE'),
                'max_tokens': max_tokens or current_app.config.get('DEFAULT_MAX_TOKENS'),
                'stream': False
            }
            
            logger.info(f'发送 AI 请求: model={request_data["model"]}, message={message[:50]}...')
            
            # 发送请求
            # base_url 已包含 /compatible-mode/v1，只需要添加 /chat/completions
            response = requests.post(
                f'{self.base_url}/chat/completions',
                headers=self._get_headers(),
                json=request_data,
                timeout=self.timeout
            )
            
            if response.status_code == 200:
                ai_response = response.json()
                reply = ai_response.get('choices', [{}])[0].get('message', {}).get('content', '')
                usage = ai_response.get('usage', {})
                
                logger.info(f'AI 响应成功: tokens={usage.get("total_tokens", 0)}')
                
                return {
                    'success': True,
                    'reply': reply,  # 返回原始 Markdown
                    'model': request_data['model'],
                    'usage': usage
                }
            else:
                logger.error(f'AI API 错误: {response.status_code} - {response.text}')
                return {
                    'success': False,
                    'error': 'AI API 调用失败',
                    'details': response.text,
                    'status_code': response.status_code
                }
        
        except requests.exceptions.Timeout:
            logger.error('AI API 请求超时')
            return {
                'success': False,
                'error': 'AI API 请求超时',
                'status_code': 504
            }
        except requests.exceptions.RequestException as e:
            logger.error(f'AI API 请求异常: {str(e)}')
            return {
                'success': False,
                'error': 'AI API 请求失败',
                'details': str(e),
                'status_code': 500
            }
        except Exception as e:
            logger.error(f'AI 服务错误: {str(e)}', exc_info=True)
            return {
                'success': False,
                'error': '服务器内部错误',
                'details': str(e),
                'status_code': 500
            }
    
    def chat_stream(self, message, model=None, temperature=None, max_tokens=None, system_prompt=None):
        """
        流式对话
        
        Args:
            message: 用户消息
            model: AI 模型
            temperature: 温度参数
            max_tokens: 最大Token数
            system_prompt: 系统提示词
        
        Yields:
            str: SSE 格式的数据流
        """
        try:
            # 构建消息列表
            messages = []
            
            if system_prompt:
                messages.append({'role': 'system', 'content': system_prompt})
            
            messages.append({'role': 'user', 'content': message})
            
            # 构建请求
            request_data = {
                'model': model or current_app.config.get('DEFAULT_MODEL'),
                'messages': messages,
                'temperature': temperature if temperature is not None else current_app.config.get('DEFAULT_TEMPERATURE'),
                'max_tokens': max_tokens or current_app.config.get('DEFAULT_MAX_TOKENS'),
                'stream': True
            }
            
            logger.info(f'发送流式 AI 请求: model={request_data["model"]}')
            
            # 发送流式请求
            # base_url 已包含 /compatible-mode/v1，只需要添加 /chat/completions
            response = requests.post(
                f'{self.base_url}/chat/completions',
                headers=self._get_headers(),
                json=request_data,
                stream=True,
                timeout=60
            )
            
            if response.status_code != 200:
                yield f"data: {json.dumps({'error': 'AI API 调用失败'})}\n\n"
                return
            
            # 处理流式响应
            for line in response.iter_lines():
                if line:
                    decoded_line = line.decode('utf-8')
                    if decoded_line.startswith('data: '):
                        data = decoded_line[6:]
                        if data.strip() == '[DONE]':
                            yield f"data: {json.dumps({'done': True})}\n\n"
                            break
                        try:
                            json_data = json.loads(data)
                            content = json_data.get('choices', [{}])[0].get('delta', {}).get('content', '')
                            if content:
                                # 直接发送原始 Markdown 片段
                                yield f"data: {json.dumps({'content': content})}\n\n"
                        except json.JSONDecodeError:
                            continue
        
        except Exception as e:
            logger.error(f'流式对话错误: {str(e)}', exc_info=True)
            yield f"data: {json.dumps({'error': str(e)})}\n\n"
    
    def get_available_models(self):
        """
        获取可用的 AI 模型列表
        
        Returns:
            dict: 包含成功状态和模型列表的字典
        """
        try:
            # base_url 已包含 /compatible-mode/v1，只需要添加 /models
            response = requests.get(
                f'{self.base_url}/models',
                headers=self._get_headers(),
                timeout=10
            )
            
            if response.status_code == 200:
                return {
                    'success': True,
                    'data': response.json().get('data', [])
                }
            else:
                return {
                    'success': False,
                    'error': '获取模型列表失败',
                    'status_code': response.status_code
                }
        
        except Exception as e:
            logger.error(f'获取模型列表错误: {str(e)}')
            return {
                'success': False,
                'error': '获取模型列表失败',
                'details': str(e),
                'status_code': 500
            }
